/*
 * @Filename: IBaseDao.java
 * @CreateTime: 2015-01-06 22:44:55
 * @Version: 1.0
 * @All rights (are) reserved.
 * @author miklechun
 */
package com.wonders.qxmanager.base;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.Query;
import org.springframework.transaction.annotation.Transactional;

import com.wonders.qxmanager.model.Log;

/**
 * @ClassName: IBaseDao
 * @Description: Dao封装接口
 * @author miklechun
 * @date 2015-01-06 22:44:55
 */
@Transactional 
public interface IBaseDao<T, ID extends Serializable> {

	public abstract List<Log> findAllLogs();
	/**
	 * <保存实体> <完整保存实体>
	 * 
	 * @param t
	 *            实体参数
	 */
	public abstract void save(T t);

	/**
	 * 更新
	 * 
	 * @param qlString
	 * @param parameter
	 * @return
	 */
	public int update(String qlString, Parameter parameter);

	/**
	 * 创建 QL 查询对象
	 * 
	 * @param qlString
	 * @param parameter
	 * @return
	 */
	public Query createQuery(String qlString, Parameter parameter);

	/**
	 * <保存或者更新实体>
	 * 
	 * @param t
	 *            实体
	 */
	public abstract void saveOrUpdate(T t);

	/**
	 * <load> <加载实体的load方法>
	 * 
	 * @param id
	 *            实体的id
	 * @return 查询出来的实体
	 */
	public abstract T load(ID id);

	/**
	 * <get> <查找的get方法>
	 * 
	 * @param id
	 *            实体的id
	 * @return 查询出来的实体
	 */
	public abstract T get(ID id);

	/**
	 * <contains>
	 * 
	 * @param t
	 *            实体
	 * @return 是否包含
	 */
	public abstract boolean contains(T t);

	/**
	 * 逻辑删除
	 * 
	 * @param id
	 * @return
	 */
	public int logicDeleteById(Serializable id);

	/**
	 * 逻辑删除
	 * 
	 * @param id
	 * @param likeParentIds
	 * @return
	 */
	public int logicDeleteById(Serializable id, String likeParentIds);

	/**
	 * <delete> <删除表中的t数据>
	 * 
	 * @param t
	 *            实体
	 */
	public abstract void delete(T t);

	/**
	 * <根据ID删除数据>
	 * 
	 * @param Id
	 *            实体id
	 * @return 是否删除成功
	 */
	public abstract boolean deleteById(ID Id);

	/**
	 * <删除所有>
	 * 
	 * @param entities
	 *            实体的Collection集合
	 */
	public abstract void deleteAll(Collection<T> entities);

	/**
	 * <执行Hql语句>
	 * 
	 * @param hqlString
	 *            hql
	 * @param parameter
	 *            不定参数
	 */
	public abstract void queryHql(String hqlString, Parameter parameter);

	/**
	 * <执行Sql语句>
	 * 
	 * @param sqlString
	 *            sql
	 * @param parameter
	 *            不定参数
	 */
	public abstract void querySql(String sqlString, Parameter parameter);

	/**
	 * <根据HQL语句查找唯一实体>
	 * 
	 * @param hqlString
	 *            HQL语句
	 * @param parameter
	 *            不定参数
	 * @return 查询实体
	 */
	public abstract T getByHQL(String hqlString, Parameter parameter);

	/**
	 * <根据SQL语句查找唯一实体>
	 * 
	 * @param sqlString
	 *            SQL语句
	 * @param parameter
	 *            不定参数
	 * @return 查询实体
	 */
	public abstract T getBySQL(String sqlString, Parameter parameter);

	/**
	 * <根据HQL语句，得到对应的list>
	 * 
	 * @param hqlString
	 *            HQL语句
	 * @param parameter
	 *            不定参数
	 * @return 查询多个实体的List集合
	 */
	public abstract List<T> getListByHQL(String hqlString, Parameter parameter);

	/**
	 * <根据SQL语句，得到对应的list>
	 * 
	 * @param sqlString
	 *            HQL语句
	 * @param parameter
	 *            不定参数
	 * @return 查询多个实体的List集合
	 */
	public abstract List<T> getListBySQL(String sqlString, Parameter parameter);

	/**
	 * 由sql语句得到List
	 * 
	 * @param sql
	 * @param map
	 * @param values
	 * @return List
	 */
	@SuppressWarnings("rawtypes")
	public List findListBySql(final String sql, final RowMapper map,
			final Object... values);

	/**
	 * <refresh>
	 * 
	 * @param t
	 *            实体
	 */
	public abstract void refresh(T t);

	/**
	 * <update>
	 * 
	 * @param t
	 *            实体
	 */
	public abstract void update(T t);

	/**
	 * <根据HQL得到记录数>
	 * 
	 * @param hql
	 *            HQL语句
	 * @param parameter
	 *            不定参数
	 * @return 记录总数
	 */
	public abstract Long countByHql(String hql, Parameter parameter);

	/**
	 * <HQL分页查询>
	 * 
	 * @param hql
	 *            HQL语句
	 * @param countHql
	 *            查询记录条数的HQL语句
	 * @param pageNo
	 *            下一页
	 * @param pageSize
	 *            一页总条数
	 * @param parameter
	 *            不定参数
	 * @return PageResults的封装类，里面包含了页码的信息以及查询的数据List集合
	 */
	public abstract PageResults<T> findPageByFetchedHql(String hql,
			String countHql, int pageNo, int pageSize, Parameter parameter);

}